<?php

namespace app\common\logic;

use think\facade\Db;

/**
 * 微信相关逻辑
 */
class Wechat
{
    private $appid = '';        //开发者ID(AppID)
    private $appsecret = '';    //开发者密码(AppSecret)
    /**
     * 初始化
     */
    public function __construct()
    {
        $wx_set = Db::name('wx_set')->where('1=1')->find();
        //读取微信小程序配置
        $this->appid = $wx_set['appid'];
        $this->appsecret = $wx_set['appsecret'];
    }
    public function access_token($platform='wx',$iscache=true){

        $appid = $this->appid;
        $appsecret = $this->appsecret;
        if(!$appid) return '';
        $tokendata = Db::name('access_token')->where('appid',$appid)->find();
        if($iscache && $tokendata && $tokendata['access_token'] && $tokendata['expires_time'] > time()){
            return $tokendata['access_token'];
        }else{
            if(!$appsecret) return '';
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$appsecret}";
            $res = json_decode(request_get($url));
            $access_token = $res->access_token;
            if($access_token) {
                if($tokendata){
                    Db::name('access_token')->where('appid',$appid)->update(['access_token'=>$access_token,'expires_time'=>time()+7000]);
                }else{
                    Db::name('access_token')->insert(['appid'=>$appid,'access_token'=>$access_token,'expires_time'=>time()+7000]);
                }
                return $access_token;
            }else{
                return array('status'=>0,'msg'=>$res);
            }
        }
    }
    //小程序 发货信息录入接口
    public function wxShipping($order,$orderType = 'shop',$shippingInfo=[]){
        $isTradeManaged = $this->isTradeManaged();
        if($isTradeManaged['status'] == 1 && $isTradeManaged['is_trade_managed']){
            \think\facade\Log::write('wxShipping发货信息录入接口orderType:'.$orderType);
            \think\facade\Log::write('wxShipping发货信息录入接口:'.jsonEncode(['ordernum'=>$order['ordernum'],'paynum'=>$order['paynum'],'aid'=>$order['aid'],'bid'=>$order['bid'],'mid'=>$order['mid'],'freight_type'=>$order['freight_type']]));
//            \think\facade\Log::write('wxShipping发货信息录入接口shippingInfo:'.jsonEncode($shippingInfo));
            //发货信息录入接口 https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order-shipping/order-shipping.html#%E4%B8%80%E3%80%81%E5%8F%91%E8%B4%A7%E4%BF%A1%E6%81%AF%E5%BD%95%E5%85%A5%E6%8E%A5%E5%8F%A3
            $orderType = str_replace('_order','',$orderType);
            $wxpaylog = Db::name('payment')->where('order_no',$order['order_no'])->where('table',$orderType)->find();
            if($wxpaylog['platform'] != 'wx'){
                \think\facade\Log::write('wxShipping发货信息录入接口:非微信小程序支付订单');
                return ['status'=>0,'msg'=>'非微信小程序支付订单'];
            }
            //支付不足20秒不请求微信接口
            if($wxpaylog['createtime'] && time() - $wxpaylog['createtime'] < 20){
                $data = [
                    'mid'=>$order['mid'],
                    'wxpaylogid'=>$wxpaylog['id'],
                    'openid'=>$wxpaylog['openid'],
                    'tablename'=>$wxpaylog['tablename'],
                    'ordernum'=>$wxpaylog['ordernum'],
                    'mch_id'=>$wxpaylog['mch_id'],
                    'createtime'=>time(),
                    'nexttime'=>time()+20,
                    'times_failed'=>0,
                    'status'=>0
                ];
                Db::name('wx_upload_shipping')->insert($data);
                \think\facade\Log::write('wxShipping发货信息录入接口:支付不足20秒不请求微信接口 稍后再次发起');
                return ['status'=>0,'msg'=>'稍后再试'];
            }
            $shipping_list = ['item_desc'=> $order['title']?$order['title']:'商城订单'];
            //0普通快递 1到店自提 2同城配送 3自动发货 4在线卡密
            if(in_array($orderType,['restaurant_shop'])){
                //无需配送 订单
                $postdata['logistics_type'] = $this->getWxLogisticsType();
            }else{
                if($order['freight_type'] === 0){
                    $shipping_list['tracking_no'] = $shippingInfo['express_no'];   //tracking_no 物流单号，物流快递发货时必填
                    $shipping_list['express_company'] = \app\common\Wxvideo::get_delivery_id($shippingInfo['express_com']);
                    $shipping_list['contact']['receiver_contact'] = substr($order['tel'], 0,3).'****'.substr($order['tel'],-4);
                    //contact 联系方式，当发货的物流公司为顺丰时，联系方式为必填，收件人或寄件人联系方式二选一
                }
                $postdata['logistics_type'] = $this->getWxLogisticsType($order['freight_type']);//物流模式，发货方式枚举值：1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品，虚拟商品，例如话费充值，点卡等，无实体配送形式 4、用户自提
            }
            $postdata['shipping_list'] = [$shipping_list];
            $postdata['order_key'] = [
                'order_number_type' => 2,
                'transaction_id'=>$wxpaylog['trade_no']
//                'mchid' => $appinfo['wxpay_type'] == 0 ? $appinfo['wxpay_mchid'] : $appinfo['wxpay_sub_mchid'],
//                'out_trade_no'=>$order['ordernum']
            ];
            $postdata['delivery_mode'] = 1;
            $postdata['upload_time'] = date(DATE_RFC3339,time());
            $openid = Db::name('social')->where('user_id',$wxpaylog['user_id'])->value('wxapp_openid');
            $postdata['payer'] = [
                'openid' => $openid
            ];
            $rs = $this->uploadShippingInfo('wx',$postdata);
            if($rs['status'] == 1){
                Db::name('wxpay_log')->where('id',$wxpaylog['id'])->update(['is_upload_shipping_info'=>1]);
            }
            return $rs;
        }
    }


    /**
     * 微信物流模式
     * @param $freight_type  0普通快递 1到店自提 2同城配送 3自动发货 4在线卡密 5门店配送
     * @return void
     */
    public function getWxLogisticsType($freight_type=''){
        //物流模式，发货方式枚举值：1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品，虚拟商品，例如话费充值，点卡等，无实体配送形式 4、用户自提
        if($freight_type === 0){
            return 1;
        }else if($freight_type == 1){
            return 4;
        }else if($freight_type == 2){
            return 2;
        }else if($freight_type == 3){
            return 3;
        }else if($freight_type == 4){
            return 3;
        }
        return 3;
    }

    /**
     * 查询小程序是否已开通发货信息管理服务 https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order-shipping/order-shipping.html#%E4%B8%83%E3%80%81%E6%9F%A5%E8%AF%A2%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%98%AF%E5%90%A6%E5%B7%B2%E5%BC%80%E9%80%9A%E5%8F%91%E8%B4%A7%E4%BF%A1%E6%81%AF%E7%AE%A1%E7%90%86%E6%9C%8D%E5%8A%A1
     * @param $aid
     * @param $platform
     * @return array|void
     */
    public function isTradeManaged($platform='wx'){
        try {
            $appid = $this->appid;
            $token = $this->access_token($platform);
            $url = "https://api.weixin.qq.com/wxa/sec/order/is_trade_managed?access_token={$token}";
            $data['appid'] = $appid;
            $rs = curl_post($url,jsonEncode($data));
            \think\facade\Log::write([
                'file'=> __FILE__.__LINE__,
                'appid'=>$appid,
                '查询小程序是否已开通发货信息管理服务'=>$rs
            ]);
            $rs = json_decode($rs,true);
            if($rs['errcode'] =='0'){
                return ['status' => 1, 'is_trade_managed' => $rs['is_trade_managed']];
            }else{
                return ['status' => 0, 'msg' => self::geterror($rs['errcode']),'errcode'=>$rs['errcode']];
            }
        }catch (\Exception $e){
            return ['status' => 0, 'msg' => $e->getMessage()];
        }
    }

    /**
     * //发货信息录入接口 https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order-shipping/order-shipping.html#%E4%B8%80%E3%80%81%E5%8F%91%E8%B4%A7%E4%BF%A1%E6%81%AF%E5%BD%95%E5%85%A5%E6%8E%A5%E5%8F%A3
     * @param $aid
     * @param $platform
     * @param $data
     * @return array|int[]|void
     * 报错：支付单不存在（10秒后再次请求，微信官方同步订单需要10秒）
     */
    public function uploadShippingInfo($platform='wx',$data=[]){
        try {
            $token = $this->access_token($platform);
            $url = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token={$token}";
//                \think\facade\Log::write('发货信息录入接口:'.jsonEncode($data));
            $rs = curl_post($url,jsonEncode($data));
//                \think\facade\Log::write('发货信息录入接口:'.$rs);
            $rs = json_decode($rs,true);
            if($rs['errcode'] =='0'){
                \think\facade\Log::write('发货信息录入接口:'.jsonEncode($rs));
                return ['status' => 1];
            }else{
                \think\facade\Log::error('发货信息录入接口:'.jsonEncode($rs));
                return ['status' => 0, 'msg' => $this->geterror($rs['errcode']),'errcode'=>$rs['errcode']];
            }
        }catch (\Exception $e){
            return ['status' => 0, 'msg' => $e->getMessage()];
        }
    }

    public function geterror($rs){
        if(is_object($rs)) $rs = (array)$rs;
        $err = array(
            '-1'      => '系统繁忙，请稍候再试',
            '0'       => '请求成功',
            '40001'   => '获取 access_token 时 AppSecret 错误，或者 access_token 无效。请认真比对 AppSecret 的正确性，或查看是否正在为恰当的公众号调用接口',
            '40002'   => '不合法的凭证类型',
            '40003'   => '不合法的openid，请确认是否已关注公众号',
            '40004'   => '不合法的媒体文件类型',
            '40005'   => '不合法的文件类型',
            '40006'   => '不合法的文件大小',
            '40007'   => '不合法的media_id',
            '40008'   => '不合法的消息类型',
            '40009'   => '不合法的图片大小',
            '40010'   => '不合法的语音大小',
            '40011'   => '不合法的视频大小',
            '40012'   => '不合法的缩略图大小',
            '40013'   => '不合法的appid，检查 AppID 的正确性，避免异常字符，注意大小写',
            '40014'   => '不合法的access_token，请认真比对 access_token 的有效性（如是否过期），或查看是否正在为恰当的公众号调用接口',
            '40015'   => '不合法的菜单类型',
            '40016'   => '不合法的按钮个数',
            '40017'   => '不合法的按钮类型',
            '40018'   => '不合法的按钮名称长度',
            '40019'   => '不合法的按钮key长度',
            '40020'   => '不合法的url长度',
            '40021'   => '不合法的菜单版本号',
            '40022'   => '不合法的子菜单级数',
            '40023'   => '不合法的子菜单按钮个数',
            '40024'   => '不合法的子菜单类型',
            '40025'   => '不合法的子菜单按钮名称长度',
            '40026'   => '不合法的子菜单按钮key长度',
            '40027'   => '不合法的子菜单按钮url长度',
            '40028'   => '不合法的自定义菜单使用用户',
            '40029'   => '不合法或已过期的code',//无效的 oauth_code
            '40030'   => '不合法的refresh_token',
            '40031'   => '不合法的 openid 列表',
            '40032'   => '不合法的 openid 列表长度',
            '40033'   => '不合法的请求字符，不能包含 \uxxxx 格式的字符',
            '40035'   => '不合法的参数',
            '40036'   => '不合法的template_id长度',
            '40037'   => '不合法的template_id',
            '40038'   => '不合法的请求格式',
            '40039'   => '不合法的url长度',
            '40048'   => '不合法的url域名',
            '40050'   => '不合法的分组 id',
            '40051'   => '分组名字不合法',
            '40054'   => '不合法的子菜单url域名',
            '40055'   => '不合法的菜单url域名',

            //开放平台
            '40101'   => '缺少必填参数',
            '41001'   => '缺少AccessToken',

            //微信卡券返回码：https://developers.weixin.qq.com/doc/offiaccount/Cards_and_Offer/Card_coupons_error_code.html
            '40053'   => '不合法的actioninfo，请开发者确认参数正确',
            '40056'   => '不合法的Code码',
            '40071'   => '不合法的卡券类型',
            '40072'   => '不合法的编码方式',
            '40078'   => '不合法的卡券状态',
            '40079'   => '不合法的时间',
            '40080'   => '不合法的CardExt',
            '40099'   => '卡券已被核销',
            '40100'   => '不合法的时间区间',
            '40116'   => '不合法的Code码',
            '40122'	  => '不合法的库存数量',
            '40124'	  => '会员卡设置查过限制的 custom_field字段',
            '40127'	  => '卡券被用户删除或转赠中',
            '41012'   => '缺少cardid参数',
            '45030'	  => '该cardid无接口权限',
            '45031'	  => '库存为0',
            '41011'	  => '缺少必填字段',
            '45021'	  => '字段超过长度限制，请参考相应接口的字段说明',
            '43009'	  => '无自定义SN权限，请前往公众平台申请',
            '43010'	  => '无储值权限，请前往公众平台申请',
            //微信卡券返回码 end

            '42001'   => 'access_token已过期',
            '42002'   => 'refresh_token超时',
            '42003'   => 'oauth_code超时',
            '42004'   => 'plugin token expired',
            '42005'   => 'api usage expired',
            '42006'   => 'component_access_token expired',
            '42007'   => '用户修改微信密码， accesstoken 和 refreshtoken 失效，需要重新授权',
            '42008'   => 'voip call key expired',
            '42009'   => 'client tmp token expired',
            '42010'   => '相同 media_id 群发过快，请重试',
            '43001'   => '需要使用get方法请求',
            '43002'   => '需要使用post方法请求',
            '43003'   => '需要使用https请求',
            '43004'   => '需要接收者关注',
            '43005'   => '需要好友关系',
            '43019'   => '需要将接收者从黑名单中移除',
            '43116'   => '该模板因滥用被滥用过多，已被限制下发',
            '44001'   => '多媒体文件为空',
            '44002'   => 'post 的数据包为空',
            '44003'   => '图文消息内容为空',
            '44004'   => '文本消息内容为空',
            '44005'   => '空白的列表',
            '44008'   => '音频内容审核失败',
            '44009'   => '图文中的音频内容审核失败',
            '45001'   => '多媒体文件大小超过限制',
            '45002'   => '消息内容大小超过限制',
            '45003'   => '标题字段超过限制',
            '45004'   => '描述字段超过限制',
            '45005'   => '链接字段超过限制',
            '45006'   => '图片链接字段超过限制',
            '45007'   => '语音播放时间超过限制',
            '45008'   => '图文消息超过限制',
            '45009'   => '接口调用超过限制',
            '45010'   => '创建菜单个数超过限制',
            '45011'   => 'api 调用太频繁，请稍候再试',
            '45012'   => '模板大小超过限制',
            '45015'   => '回复时间超过限制',
            '45016'   => '不能修改默认组',
            '45017'   => '分组名字过长',
            '45018'   => '分组数量超过上限',
            '45047'   => '客服接口下行条数超过上限',
            '45064'   => '创建菜单包含未关联的小程序',
            '45065'   => '相同 clientmsgid 已存在群发记录，返回数据中带有已存在的群发任务的 msgid',
            '45066'   => '相同 clientmsgid 重试速度过快，请间隔1分钟重试',
            '45067'   => 'clientmsgid 长度超过限制',
            '45110'   => '作者字数超出限制',
            '46001'   => '不存在媒体数据',
            '46002'   => '不存在的菜单版本',
            '46003'   => '不存在的菜单数据',
            '46004'   => '指定的用户不存在',
            '47001'   => '解析 json/xml 内容错误',
            '47003'   => '参数值不符合限制要求，详情可参考参数值内容限制说明',

            '48001'   => 'api 功能未授权，请确认公众号已获得该接口，可以在公众平台官网 - 开发者中心页中查看接口权限',
            '48002'   => '粉丝拒收消息（粉丝在公众号选项中，关闭了 “ 接收消息 ” ）',
            '48003'   => '不合法的suite_id',
            '48004'   => 'api 接口被封禁或授权关系无效',
            '48005'   => 'api 禁止删除被自动回复和自定义菜单引用的素材或api接口已废弃',
            '48006'   => 'api 禁止清零调用次数，因为清零次数达到上限',
            '48008'   => '没有该类型消息的发送权限',
            '48021'   => '自动保存的草稿无法预览/发送，请先手动保存草稿',
            '50001'   => '接口未授权或redirect_url未登记可信域名',
            '50002'   => '用户受限，可能是违规后接口被封禁',
            '50003'   => '应用已禁用，user unexpected, maybe not in white list',
            '50004'   => 'user not allow to use accesstoken, maybe for punishment',
            '50005'   => '用户未关注公众号',
            '53010'   => '名称格式不合法',
            '53011'   => '名称检测命中频率限制',
            '53012'   => '禁止使用该名称',
            '53013'   => '公众号：名称与已有公众号名称重复;小程序：该名称与已有小程序名称重复',
            '53014'   => '公众号：公众号已有{名称a+}时，需与该帐号相同主体才可申请{名称a};小程序：小程序已有{名称a+}时，需与该帐号相同主体才可申请{名称a}',
            '53015'   => '公众号：该名称与已有小程序名称重复，需与该小程序帐号相同主体才可申请;小程序：该名称与已有公众号名称重复，需与该公众号帐号相同主体才可申请',
            '53016'   => '公众号：该名称与已有多个小程序名称重复，暂不支持申请;小程序：该名称与已有多个公众号名称重复，暂不支持申请',
            '53017'   => '公众号：小程序已有{名称a+}时，需与该帐号相同主体才可申请{名称a};小程序：公众号已有{名称a+}时，需与该帐号相同主体才可申请{名称a}',
            '53018'   => '名称命中微信号',
            '53019'   => '名称在保护期内',
            '53200'   => '本月功能介绍修改次数已用完',
            '53201'   => '功能介绍内容命中黑名单关键字',
            '53202'   => '本月头像修改次数已用完',
            '53300'   => '超出每月次数限制',
            '53301'   => '超出可配置类目总数限制',
            '53302'   => '当前账号主体类型不允许设置此种类目',
            '53303'   => '提交的参数不合法',
            '53304'   => '与已有类目重复',
            '53305'   => '包含未通过ipc校验的类目',
            '53306'   => '修改类目只允许修改类目资质，不允许修改类目id',
            '53307'   => '只有审核失败的类目允许修改',
            '53308'   => '审核中的类目不允许删除',
            '53309'   => '社交红包不允许删除',
            '53310'   => '类目超过上限，但是可以添加apply_reason参数申请更多类目',
            '53311'   => '需要提交资料信息',
            '53500'   => '发布功能被封禁',
            '53501'   => '频繁请求发布',
            '53502'   => 'Publish ID 无效',
            '53600'   => 'Article ID 无效',

            '61450'   => '系统错误 (system error)',
            '61451'   => '参数错误 (invalid parameter)',
            '61452'   => '无效客服账号 (invalid kf_account)',
            '61453'   => '客服帐号已存在 (kf_account exsited)',
            '61454'   => '客服帐号名长度超过限制 ( 仅允许 10 个英文字符，不包括 @ 及 @ 后的公众号的微信号 )(invalid kf_acount length)',
            '61455'   => '客服帐号名包含非法字符 ( 仅允许英文 + 数字 )(illegal character in kf_account)',
            '61456'   => '客服帐号个数超过限制 (10 个客服账号 )(kf_account count exceeded)',
            '61457'   => '无效头像文件类型 (invalid file type)',
            '61500'   => '日期格式错误',
            '63001'   => '部分参数为空',
            '63002'   => '无效的签名',
            '65301'   => '不存在此 menuid 对应的个性化菜单',
            '65302'   => '没有相应的用户',
            '65303'   => '没有默认菜单，不能创建个性化菜单',
            '65304'   => 'matchrule 信息为空',
            '65305'   => '个性化菜单数量受限',
            '65306'   => '不支持个性化菜单的帐号',
            '65307'   => '个性化菜单信息为空',
            '65308'   => '包含没有响应类型的 button',
            '65309'   => '个性化菜单开关处于关闭状态',
            '65310'   => '填写了省份或城市信息，国家信息不能为空',
            '65311'   => '填写了城市信息，省份信息不能为空',
            '65312'   => '不合法的国家信息',
            '65313'   => '不合法的省份信息',
            '65314'   => '不合法的城市信息',
            '65316'   => '该公众号的菜单设置了过多的域名外跳（最多跳转到 3 个域名的链接）',
            '65317'   => '不合法的 url',
            '72023'   => '发票已被其他公众号锁定',
            '72024'   => '发票状态错误',
            '72037'   => '存在发票不属于该用户',
            '80000'   => '系统错误，请稍后再试',

            '85001'   => '微信号不存在或微信号设置为不可搜索',
            '85002'   => '小程序绑定的体验者数量达到上限',
            '85003'   => '微信号绑定的小程序体验者达到上限',
            '85004'   => '微信号已经绑定',
            '85005'   => '可信域名未通过所有权校验',
            '85006'   => '标签格式错误',
            '85007'   => '页面路径错误',
            '85008'   => '类目填写错误',
            '85009'   => '已经有正在审核的版本',
            '85010'   => 'item_list有项目为空',
            '85011'   => '标题填写错误',
            '85012'   => '无效的审核id',
            '85013'   => '无效的自定义配置',
            '85014'   => '无效的模版编号',
            '85015'   => '该账号不是小程序账号',
            '85016'   => '域名数量超过限制',
            '85017'   => '没有新增域名，请确认小程序已经添加了域名或该域名是否没有在第三方平台添加',
            '85018'   => '域名没有在第三方平台设置',
            '85019'   => '没有审核版本',
            '85020'   => '审核状态未满足发布',
            '85023'   => '审核列表填写的项目数不在1-5以内',
            '85026'   => '微信号绑定管理员名额达到上限',
            '85027'   => '身份证绑定管理员名额达到上限',
            '85043'   => '模版错误',
            '85044'   => '代码包超过大小限制',
            '85045'   => 'ext_json有不存在的路径',
            '85046'   => 'tabbar中缺少path',
            '85047'   => 'pages字段为空',
            '85048'   => 'ext_json解析失败',
            '85051'   => 'version_desc或者preview_info超限',
            '85060'   => '无效的taskid',
            '85061'   => '手机号绑定管理员名额达到上限',
            '85062'   => '手机号黑名单',
            '85063'   => '身份证黑名单',
            '85064'   => '找不到模版',
            '85065'   => '模版库已满',
            '85066'   => '链接错误',
            '85068'   => '测试链接不是子链接',
            '85069'   => '校验文件失败',
            '85070'   => '链接为黑名单',
            '85071'   => '已添加该链接，请勿重复添加',
            '85072'   => '该链接已被占用',
            '85073'   => '二维码规则已满',
            '85074'   => '小程序未发布, 小程序必须先发布代码才可以发布二维码跳转规则',
            '85075'   => '个人类型小程序无法设置二维码规则',
            '85076'   => '链接没有icp备案',
            '85077'   => '小程序类目信息失效（类目中含有官方下架的类目，请重新选择类目）',
            '85079'   => '小程序没有线上版本，不能进行灰度',
            '85080'   => '小程序提交的审核未审核通过',
            '85081'   => '无效的发布比例',
            '85082'   => '当前的发布比例需要比之前设置的高',
            '85083'   => '搜索标记位被封禁，无法修改',
            '85084'   => '非法的status值，只能填0或者1',
            '85085'   => '小程序提审数量已达本月上限，可以通过“小程序服务商助手-我的-咨询反馈”联系人工客服进行申请更多临时额度，客服工作时间：工作日：9:00-12:00,14:00-18:00',//《自助临时申请额度》https://developers.weixin.qq.com/community/minihome/doc/00022ce7b209f09f363b9c62958401?blockType=99
            '85086'   => '提交代码审核之前需提前上传代码',
            '85087'   => '小程序已使用api navigatetominiprogram，请声明跳转appid列表后再次提交',
            '86000'   => '不是由第三方代小程序进行调用',
            '86001'   => '不存在第三方的已经提交的代码',
            '86002'   => '小程序未初始化完成，请确保已设置小程序昵称、头像、简介、服务类目',
            '86007'   => '小程序禁止提交',
            '86008'   => '服务商被处罚，限制全部代码提审能力',
            '86009'   => '服务商新增小程序代码提审能力被限制',
            '86010'   => '服务商迭代小程序代码提审能力被限制',
            '87009'   => '无效的签名',
            '87011'   => '现网已经在灰度发布，不能进行版本回退',
            '87012'   => '该版本不能回退，可能的原因：1:无上一个线上版用于回退 2:此版本为已回退版本，不能回退 3:此版本为回退功能上线之前的版本，不能回退',
            '87013'   => '撤回次数达到上限（每天一次，每个月10次）',
            '88000'   => '公众号没有开通留言功能',
            '89007'   => '小程序本月被关联的名额已用完',
            '89008'   => '小程序为海外帐号，不允许关联',
            '89009'   => '小程序关联达到上限',
            '89010'   => '已经发送关联邀请',
            '89011'   => '在附近中展示的小程序不能取消关联',
            '89012'   => '门店、小店小程序不能取消关联',
            '89013'   => '小程序被封禁',
            '89015'   => '已经关联该小程序',
            '89016'   => '公众号本月关联相同主体达到上限',
            '89017'   => '公众号本月关联不同主体达到上限',
            '89035'   => '已经从公众平台后台发起关联申请，处于小程序管理员确认中，无法从第三方重复发起关联申请',
            '89000'   => '该公众号 / 小程序 已经绑定了开放平台帐号',
            '89001'   => 'not same contractor，authorizer与开放平台帐号主体不相同',
            '89002'   => 'open not exists，该公众号/小程序未绑定微信开放平台帐号。',
            '89003'   => '该开放平台帐号并非通过api创建，不允许操作',
            '89004'   => '该开放平台帐号所绑定的公众号/小程序已达上限（100个）',
            '89019'   => '业务域名无更改，无需重复设置',
            '89020'   => '尚未设置小程序业务域名，请先在第三方平台中设置小程序业务域名后在调用本接口',
            '89021'   => '请求保存的域名不是第三方平台中已设置的小程序业务域名或子域名',
            '89029'   => '业务域名数量超过限制，最多可以添加100个业务域名',
            '89231'   => '个人小程序不支持调用setwebviewdomain 接口',
            '89236'   => '该插件不能申请',
            '89237'   => '已经添加该插件',
            '89238'   => '申请或使用的插件已经达到上限',
            '89239'   => '该插件不存在',
            '89256'   => 'token信息有误',
            '89257'   => '该插件版本不支持快速更新',
            '89258'   => '当前小程序帐号存在灰度发布中的版本，不可操作快速更新',
            '89249'   => '该主体已有任务执行中，距上次任务24h后再试',
            '89247'   => '内部错误',
            '89250'   => '未找到该任务',
            '89251'   => '待法人人脸核身校验',
            '89252'   => '法人&企业信息一致性校验中	',
            '89253'   => '缺少参数',
            '89254'   => '第三方权限集不全，补全权限集全网发布后生效',
            '89255'   => '企业代码不正确',

            '91001'   => '不是公众号快速创建的小程序',
            '91002'   => '小程序发布后不可改名',
            '91003'   => '改名状态不合法',
            '91004'   => '昵称不合法',
            '91005'   => '昵称命中主体保护',
            '91006'   => '昵称命中微信号',
            '91007'   => '昵称已被占用',
            '91008'   => '昵称命中7天侵权保护期',
            '91009'   => '需要提交材料',
            '91010'   => '其他错误',
            '91011'   => '查不到昵称修改审核单信息',
            '91012'   => '其它错误',
            '91013'   => '占用名字过多',
            '91014'   => '+号规则 同一类型关联名主体不一致',
            '91015'   => '原始名不同类型主体不一致',
            '91016'   => '名称占用者 ≥2',
            '91017'   => '+号规则 不同类型关联名主体不一致',
            '91018'   => '组织类型小程序发布后，侵权被清空昵称，需走认证改名',
            '91019'   => '小程序正在审核中',
            '91040'   => '获取ticket的类型无效',
            '94012'   => 'appid和商户号的绑定关系不存在',



            '9001001' => 'post 数据参数不合法',
            '9001002' => '远端服务不可用',
            '9001003' => 'ticket 不合法',
            '9001004' => '获取摇周边用户信息失败',
            '9001005' => '获取商户信息失败',
            '9001006' => '获取 openid 失败',
            '9001007' => '上传文件缺失',
            '9001008' => '上传素材的文件类型不合法',
            '9001009' => '上传素材的文件尺寸不合法',
            '9001010' => '上传失败',
            '9001020' => '帐号不合法',
            '9001021' => '已有设备激活率低于 50% ，不能新增设备',
            '9001022' => '设备申请数不合法，必须为大于 0 的数字',
            '9001023' => '已存在审核中的设备 id 申请',
            '9001024' => '一次查询设备 id 数量不能超过 50',
            '9001025' => '设备 id 不合法',
            '9001026' => '页面 id 不合法',
            '9001027' => '页面参数不合法',
            '9001028' => '一次删除页面 id 数量不能超过 10',
            '9001029' => '页面已应用在设备中，请先解除应用关系再删除',
            '9001030' => '一次查询页面 id 数量不能超过 50',
            '9001031' => '时间区间不合法',
            '9001032' => '保存设备与页面的绑定关系参数错误',
            '9001033' => '门店 id 不合法',
            '9001034' => '设备备注信息过长',
            '9001035' => '设备申请参数不合法',
            '9001036' => '查询起始值 begin 不合法',
            '41030'   => '小程序页面尚未发布,无法生成',//此返回码存在多个 总结就是小程序page路径不对
            '61051'   => '公众号主体类型不允许快速创建',
            '61052'   => '公众号未认证',
            '61053'   => '超过主体可注册数量上限',
            '61054'   => '主体黑名单',
            '61055'   => '超出公众号每月可快速创建限额',
            '61056'   => '政府、媒体、其他组织必须复选微信认证',
            '61057'   => '公众号仍有快速创建的账号在流程中',
            '61058'   => '用户扫码凭证校验不通过',
            '61028'   => '第三方平台未发布',
            '61029'   => '第三方平台缺少必备权限集(帐号服务权限、程序帐号管理权限、小程序开发管理与数据分析权限)',
            '61060'   => '转 uri 不合法',
            '61061'   => '海外帐号不允许快速创建',
            '86004'   => '无效微信号',
            '61070'   => '企业代码类型无效，请选择正确类型填写',

            '92000'   => '该经营资质已添加，请勿重复添加',
            '92002'   => '附近地点添加数量达到上线，无法继续添加',
            '92003'   => '地点已被其它小程序占用',
            '92004'   => '附近功能被封禁',
            '92005'   => '地点正在审核中',
            '92006'   => '地点正在展示小程序',
            '92007'   => '地点审核失败',
            '92008'   => '程序未展示在该地点',
            '93009'   => '小程序未上架或不可见',
            '93010'   => '地点不存在',
            '93011'   => '个人类型小程序不可用',
            '93012'   => '非普通类型小程序（门店小程序、小店小程序等）不可用',
            '93013'   => '从腾讯地图获取地址详细信息失败',
            '93014'   => '同一资质证件号重复添加',
            '61007'   => '无接口权限或您授权了多个平台,请前往公众平台登录小程序账号,在[设置-第三方设置]中取消所有授权,然后重新授权',
            '1003'    => '商品id不存在',
            '300001'  => '禁止创建/更新商品 或 禁止编辑&更新房间',
            '300002'  => '名称长度不符合规则',
            '300003'  => '价格输入不合规（如：现价比原价大、传入价格非数字等）',
            '300004'  => '商品名称存在违规违法内容',
            '300005'  => '商品图片存在违规违法内容',
            '300006'  => '图片上传失败（如：mediaid过期）',
            '300007'  => '线上小程序版本不存在该链接',
            '300008'  => '添加商品失败',
            '300009'  => '商品审核撤回失败',
            '300010'  => '商品审核状态不对（如：商品审核中）',
            '300011'  => '操作非法（api不允许操作非api创建的商品）',
            '300012'  => '没有提审额度（每天500次提审额度）',
            '300013'  => '提审失败',
            '300014'  => '审核中，无法删除（非零代表失败）',
            '300017'  => '商品未提审',
            '300018'  => '商品图片尺寸过大',
            '300021'  => '商品添加成功，审核失败',
            '300022'  => '此房间号不存在',
            '300023'  => '房间状态 拦截（当前房间状态不允许此操作）',
            '300024'  => '商品不存在',
            '300025'  => '商品审核未通过',
            '300026'  => '房间商品数量已经满额',
            '300027'  => '导入商品失败',
            '300028'  => '房间名称违规',
            '300029'  => '主播昵称违规',
            '300030'  => '主播微信号不合法',
            '300031'  => '直播间封面图不合规',
            '300032'  => '直播间分享图违规',
            '300033'  => '添加商品超过直播间上限',
            '300034'  => '主播微信昵称长度不符合要求',
            '300035'  => '主播微信号不存在',
            '300036'  => '主播微信号未实名认证',
            '300037'  => '购物直播频道封面图不合规',
            '300038'  => '未在小程序管理后台配置客服',
            '300039'  => '主播副号微信号不合法',
            '300040'  => '名称含有非限定字符（含有特殊字符）',
            '300041'  => '创建者微信号不合法',
            '9410000' => '直播间列表为空',
            '9410001' => '获取房间失败',
            '9410002' => '获取商品失败',
            '9410003' => '获取回放失败',
            '400001'  => '微信号不合规',
            '400002'  => '微信号需要实名认证，仅设置主播角色时可能出现',
            '400003'  => '添加角色达到上限（管理员10个，运营者500个，主播500个）',
            '400004'  => '重复添加角色',
            '400005'  => '主播角色删除失败，该主播存在未开播的直播间',
        );
        //注意！！！注意！！！注意！！！注意！！！注意！！！与公共返回码冲突的请勿加入此处，需要独立定义返回码错误转换方法
        if(is_array($rs)){
            return $err[$rs['errcode']] ? $err[$rs['errcode']] : $rs['errcode'].': '.$rs['errmsg'];
        }else{
            return $err[$rs] ? $err[$rs] : $rs;
        }
    }
}